#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;

// 头插法单链表，建立带头结点的单链表L
void CreateListHead(LinkList &L, int n) 
{
    L = new Node; // 创建头节点
    L->next = nullptr; // 初始化为空链表
    
    for(int i = 0; i < n; ++i) 
    {
        LinkList p = new Node; // 创建新节点
        cin >> p->data; // 输入数据
        p->next = L->next; // 新节点指向原第一个节点
        L->next = p; // 头节点指向新节点
    }
}


// 单链表读取，用e返回L中第i个数据元素的值
Status GetELem(LinkList L, int i, ElemType *e)
{
    int j = 1; // j是计数器;
    LinkList p;
    p = L->next; // p指向L的第一个结点
    
    while(p && j < 1)
    {
        p = p->next;
        ++j;
    }

    if(!p || j > i)
        return ERROR;
    *e = p->data;
    return OK;
}

// 单链表插入，在L的第i个位置之前插入新的数据元素e，L的长度加1
Status ListInsert(LinkList *L, int i, ElemType e)
{
    int j = 1;
    LinkList p = *L;
    while(p && j < i)
    {
        p = p->next;
        ++j;
    }
    if(!p || j > i) return ERROR;
    
    // LinkList s = (LinkList)malloc(sizeof(Node));
    LinkList s = new Node;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

// 单链表删除，删除L的第i个数据元素，并用e返回其值，L的长度减1
Status ListDelete(LinkList *L, int i, ElemType *e)
{
    int j = 1;
    LinkList p = *L;
    while(p->next && j < i)
    {
        p = p->next;
        ++j;
    }
    if(!p->next || j > i)
        return ERROR;
    
    LinkList q = p->next;
    *e = q->data;
    delete q;
    return OK;
}



int main()
{
    return 0;
}